/**
 * 价格格式化工具函数
 */

export interface FormatPriceOptions {
  /** 货币符号 */
  symbol?: string
  /** 小数位数 */
  decimals?: number
  /** 千分位分隔符 */
  separator?: string
  /** 是否显示符号 */
  showSymbol?: boolean
  /** 小数点符号 */
  decimalPoint?: string
}

/**
 * 格式化价格
 * @param price 价格（单位：分）
 * @param options 格式化选项
 * @returns 格式化后的价格字符串
 */
export const formatPrice = (
  price: number | string,
  options: FormatPriceOptions = {}
): string => {
  const {
    symbol = '¥',
    decimals = 2,
    separator = ',',
    showSymbol = true,
    decimalPoint = '.',
  } = options

  // 处理无效输入
  if (price === null || price === undefined || price === '') {
    return showSymbol ? `${symbol}0${decimalPoint}00` : `0${decimalPoint}00`
  }

  // 转换为数字（假设传入的是分）
  const priceNum = typeof price === 'string' ? parseFloat(price) : price

  // 转换为元
  const yuan = priceNum / 100

  // 处理小数位数
  const fixedPrice = yuan.toFixed(decimals)

  // 分割整数和小数部分
  const [integerPart, decimalPart] = fixedPrice.split('.')

  // 添加千分位分隔符
  const formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separator)

  // 组合结果
  let result = decimals > 0 ? `${formattedInteger}${decimalPoint}${decimalPart}` : formattedInteger

  // 添加货币符号
  if (showSymbol) {
    result = `${symbol}${result}`
  }

  return result
}

/**
 * 格式化价格范围
 * @param minPrice 最低价格（单位：分）
 * @param maxPrice 最高价格（单位：分）
 * @param options 格式化选项
 * @returns 格式化后的价格范围字符串
 */
export const formatPriceRange = (
  minPrice: number | string,
  maxPrice: number | string,
  options: FormatPriceOptions = {}
): string => {
  const min = formatPrice(minPrice, { ...options, showSymbol: false })
  const max = formatPrice(maxPrice, options)

  return `${options.symbol || '¥'}${min} - ${max}`
}

/**
 * 格式化折扣价格
 * @param originalPrice 原价（单位：分）
 * @param currentPrice 现价（单位：分）
 * @param options 格式化选项
 * @returns 包含原价和现价的对象
 */
export const formatDiscountPrice = (
  originalPrice: number | string,
  currentPrice: number | string,
  options: FormatPriceOptions = {}
) => {
  return {
    original: formatPrice(originalPrice, options),
    current: formatPrice(currentPrice, options),
    discount: calculateDiscount(originalPrice, currentPrice),
  }
}

/**
 * 计算折扣百分比
 * @param originalPrice 原价（单位：分）
 * @param currentPrice 现价（单位：分）
 * @returns 折扣百分比（例如：8.5 表示 8.5 折）
 */
export const calculateDiscount = (
  originalPrice: number | string,
  currentPrice: number | string
): number => {
  const original = typeof originalPrice === 'string' ? parseFloat(originalPrice) : originalPrice
  const current = typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice

  if (original <= 0) return 0

  const discount = (current / original) * 10
  return Math.round(discount * 10) / 10 // 保留一位小数
}

/**
 * 将元转换为分
 * @param yuan 元
 * @returns 分
 */
export const yuanToFen = (yuan: number | string): number => {
  const yuanNum = typeof yuan === 'string' ? parseFloat(yuan) : yuan
  return Math.round(yuanNum * 100)
}

/**
 * 将分转换为元
 * @param fen 分
 * @returns 元
 */
export const fenToYuan = (fen: number | string): number => {
  const fenNum = typeof fen === 'string' ? parseFloat(fen) : fen
  return fenNum / 100
}

export default {
  formatPrice,
  formatPriceRange,
  formatDiscountPrice,
  calculateDiscount,
  yuanToFen,
  fenToYuan,
}

